/*
 * @Author: linzeqin
 * @Date: 2019-10-23 09:41:06
 * @description: jenkins定时任务
 */
import * as egg from 'egg';
import { IJenkinsTaskReportModel, JenkinsTaskJobItem } from '../model/jenkinsTaskModel';
const Subscription = egg.Subscription;

export default class JenkinsTaskSchedule extends Subscription {
    static get schedule() {
        return {
            cron: '0 */1 * * * *', // 一分钟准点执行一次
            type: 'all', // 指定所有的 worker 都需要执行
        };
    }

    async subscribe() {
        /* this.taskBuild(); */
    }
    /** 自动执行构建计划 */
    async taskBuild() {
        /** +100的作用是将误差控制在正向100毫秒左右 */
        const time = new Date().getTime() + 100;
        try {
            const taskList: IJenkinsTaskReportModel[] = await this.ctx.model.JenkinsTaskModel.find({
                scheduleTime: { $gt: time - 60000, $lt: time },
            });
            taskList.forEach(async (task: IJenkinsTaskReportModel) => {
                /** 查询创建者的jenkins token */
                const userInfo = await this.ctx.model.User.findOne({
                    /* uuid: task.creatorUid, */
                });
                /** 通过token执行jenkins构建 */
                if (userInfo) {
                    const res = task.jobList.map(async (job: JenkinsTaskJobItem) => {
                        return await this.service.jenkinsService.common({
                            apiKey: 'build_with_params',
                            options: [ job.name, job.params ],
                            token: userInfo.jToken,
                        });
                    });
                    this.logger.info(`
                        -----------执行jenkins构建计划---------，
                        任务名称：${task.name}，
                        构建项目：${JSON.stringify(task.jobList.map(i => i.name))}，
                        计划时间：${new Date(task['scheduleTime']).toLocaleString()}，
                        实际时间：${new Date().toLocaleString()}，
                        执行结果：${JSON.stringify(res)}`,
                    );
                }
            });
        } catch (error) {
            this.logger.error('Jenkins定时任务执行异常', error);
        }
    }
}
